package main

import (
	app_global "app/app_src/framework/app/global"
	app_util "app/app_src/framework/app/util"
	gin_util "app/app_src/framework/gin/util"
	"app/app_src/framework/ioc"
	modules "app/app_src/modules"

	dev_tools "app/app_src/framework/dev_tools"
	gin_handler "app/app_src/framework/gin/handler"
	file_util "app/app_src/framework/util/file"
	context_path_util "app/app_src/framework/util/web/context_path"

	"github.com/gin-contrib/static"
)

func main() {
	// 初始应用的全局信息，其中第一个参数 appDir 按照 main.go 文件的路径计算出来
	app_global.InitGlobal("../", "")
	// 获取配置
	config := app_util.GetConfigByArgs()
	// 设置加密盐值
	app_global.SetSecretSalt(config.SecretSalt)

	// 初始 ioc 容器
	builder := ioc.NewBuilder()
	modules.InjectDependencies(builder)
	ioc.InitGlobalContainer(builder.Build())

	// 获取 gin 引擎
	engine := gin_util.GetEngine()
	router := engine.Group(app_global.ContextPath())
	// 注册各个模块的路由
	modules.RegisterRoutes(router)
	// 注册渲染脚本的中间件
	engine.Use(gin_handler.NewRenderScriptHandler(context_path_util.WithContextPath("/app/")))
	// 注册处理静态文档的中间件
	docFileSystem := static.LocalFile("doc", true)
	docHandlerFunc := static.Serve(context_path_util.WithContextPath("/doc"), docFileSystem)
	engine.Use(docHandlerFunc)

	// 注册开发者工具接口
	dev_tools.RegisterRoutes(router)

	if app_util.IsLocalEnv() {
		appPath := app_global.AppDir()
		adjustedPath := file_util.JoinPath(appPath, "web_root/test")
		testFileSystem := static.LocalFile(adjustedPath, true)
		testHandlerFunc := static.Serve(context_path_util.WithContextPath("/test"), testFileSystem)
		// 注册处理静态测试资源的中间件
		engine.Use(testHandlerFunc)
	}

	gin_util.RunApp(engine, "8080")
}
